#define VAR_SIMPLES 1
#define CONSTANTE 2
#define PONTEIRO 3
#define ARRAY_T 4

#define CHAR_V 10
#define INT_V 11
#define FLOAT_V 12
#define STRING_V 13



#define ERR_CONSTANTE_EXISTE -1

#define EH_VAR 0
#define EH_FUNC_PROC 1

#include <string.h>


typedef struct unitVar
{	
	//Se é booleano, char, string, ou definido pelo usuario.
	int id;
	//Se é variavel simples, constante, ponteiro ou array
	int type;

	//1:eh global,0:nao eh global
	int ehGlobal;

	//Se for tipo definido pelo usuário, o indice na tabela de tipos que define este novo tipo
	int typeNameIndex;

	//Se for ponteiro ou array, aqui é a dimensao (array multidimensional, ponteiro para ponteiro...)
	int dimensao;

	//Se for array, o valor que tem que subtrair de cada posicao de vetor para que fique compativel com C
	int deslocamento;
}unitV;

typedef struct unitProcFunc
{
	//1 eh funcao, 2 eh procedimento
	int ProcOrFunc;

	//indice na tabela de tipos que referencia o retorno desta funcao
	int returnTypeIndex;

	//Indice dos tipos dos parametros
	int * parametros;

	int isAspect;

	int beforeOrAfter;

	int functionIndex;	
}unitPF;

typedef struct unitTabela
{
	//1: Elemento ativo (var ou proc), //3: Mudanca de escopo,mas o que vem antes eh visivel
	//2:Mudanca de escopo, mas somente as variaveis globais sao visiveis 	
	int scopeOrEl;	
		
	//nome do elemento
	char * name;
	
	//Eh funcao(procedimento)
	int typeVar;

	unitV var;

	unitPF pf;
	
}unitT;


unitT * tabelaDeSimbolos;
int tdsIndex;
int tdsSize;


int inserirConstante(char * nome,char * valor,int tipo,int ehGlobal)
{
    int i ;
    for(i = tdsIndex-1; i > 0 ; i--)
    {
        if(strcmp(nome,tabelaDeSimbolos[i].name))
        {
            return ERR_CONSTANTE_EXISTE;
        }
    }

    unitT el;
    el.name = nome;
    el.typeVar = EH_VAR;
    el.scopeOrEl = 1;

    el.var.id = tipo;
    el.var.type = CONSTANTE;
    el.var.ehGlobal = ehGlobal;
    return 1;    
}

//======================================
//======================================

//TABELA DE TIPOS

typedef struct unitType
{
	
	unitV * info;

	//Se for record, as variaveis armazenadas no record
	struct unitType * elementos;
	


}unitTy;

unitTy * tabelaDeTipos;
int tdtIndex;
int tdtSize;


void tbInicializarTabelas()
{
	tabelaDeSimbolos = (unitT*)malloc(50*sizeof(unitT));
	tabelaDeTipos = (unitTy*)malloc(50*sizeof(unitTy));
	int tdsIndex = 50;
	int tdtIndex = 50;
}










